/*
 * @Author: lirl
 * @Date: 2024-05-30 10:21:29
 * @Description: 流程模板公共混入
 */
import { mapGetters } from 'vuex';
import { isEmpty, isNil } from 'lodash-es';
import { TransService } from 'jdf-jssdk';
import { getToken } from '@/api/utils/storage-util';
import { bizServiceURL } from '@/api/utils/constants';
import Uri from 'urijs';
import { message } from '@/api/utils/pc-message';
import { closeWindow, ifTrue } from 'jdf-util';

export default {
  data() {
    const { $route: { query } } = this;
    return {
      // 表单属性
      formAttrs: {
        // 隐藏校验不通过时的红色信息
        'show-message': false,
        // 隐藏必填的星号
        'hide-required-asterisk': true,
      },
      // 是否使用弹窗校验
      validateByAlert: true,
      // 是否开启双击预览
      enableDbClickPreview: false,
      // 是否上传附件后，默认将附件关联到正文附件中
      defaultAddDocAttachment: true,
      // 是否在设置背靠背附件后，清空正文附件关联
      clearDocAttAfterSettingBackToBack: true,
      // 任何密集都能同时下载doc和pdf
      importantSecretDownLoad: false,
      // 公文质效需要的orgCode层级
      bizBudgeInfoOrgCodeLevel: -1,
      // 无意见数据时是否折叠意见区
      emptyOpinionCollapse: false,
      // 生产环境是否不根据密级显示水印，而是总显示水印
      prodDisplayWatermark: false,
      // 所有字段是否只读
      allFieldsReadonly: false,
      // 附件备注
      attachmentRemark: '',
      // 业务设置路径扩展参数
      pathVarData: null,
      // 业务设置候选人扩展参数
      candidateVarData: null,
      // 版式公文数据
      docData: {},
      // 密级
      secret: '',
      // 待办标题
      processTitle: '',
      // 其它要传递的字段
      otherDatas: {},
      // 业务表单数据
      bizFormData: null,
      // 回文id
      pmsid: query.pmsid,
      // 在保存业务数据时需要保存的字段
      needSaveDatas: {
        pmsid: query.pmsid,
        maintainField: query.maintainField
      },
    };
  },
  computed: {
    ...mapGetters(['treeId', 'telphone', 'loginName', 'downloadTypes', 'printTypes', 'orgId']),
    /**
     * 流程实例id
     */
    piid() {
      return this.configData.processInstance?.processInstanceId;
    },
    /**
     * 附件上传头信息
     */
    uploadRequestHeaders() {
      return {
        Authorization: getToken(),
      };
    },
  },
  provide() {
    return {
    };
  },
  methods: {
    /**
     * 密级切换事件
     */
    changeSecret(val) {
      // 判断密级切换时，传入参数是否等于’无（密级）‘，如果是其他密级类型，代表下载pdf格式
      this.secret = val ?? '';
    },
    /**
     * 设置子组件所有字段为只读
     */
    setAllFieldsReadonly(status) {
      this.allFieldsReadonly = status;
    },
    /**
     * 输入附件说明
     */
    changeAttachmentRemark(val) {
      this.attachmentRemark = val;
    },
    /**
     * 设置路径查询变量
     * @param {Object} data 设置路径变量
     */
    getPathVarData(data) {
      this.pathVarData = data;
    },
    /**
     * 设置候选人查询变量
     * @param {Object} data 设置的候选人变量
     */
    getCandidateVarData(data) {
      this.candidateVarData = data;
    },
    /**
     * 设置版式公文数据
     * @param {Object} data 版式公文数据
     */
    setDocData(data) {
      this.docData = data;
    },
    /**
     * 子组件其它事件
     */
    commonEvent(data) {
      this.otherDatas = {
        ...this.otherDatas,
        ...data,
      };
    },
    /**
     * 获取子表单数据的方法
     */
    getBizFormData() {
      return this.$refs.subform.getBizFormData?.();
    },
    /**
     * 自定义正文附件、一键下载文件的名称
     * @param {Object} formData 业务表单数据
     */
    bizDownloadFileTitleFunc(formData) {
      return this.$refs.subform?.downloadFileTitleFunc?.(formData);
    },
    /**
     * 子组件加载完成事件
     * @param {Object} formData 子组件表单数据
     */
    afterLoadSubForm(formData) {
      this.bizFormData = formData;
    },
    /**
     * 版式公文加载完成后置事件
     * @param {Object} 版式公文对象
     */
    afterLoadDocEditor() {

    },
    /**
     * 版式公文页面加载事件。页面首次加载、切换公文/极简模式都会触发
     */
    afterLoadDocPage(editor, docEditorRef) {
    },
    /**
     * 表单模板其它事件
     */
    templateCommonEvent(data) {
      this.$refs.subform.bizSet(data);
    },
    /**
     * 业务数据保存的方法
     * @param {Object} data 要放到formData中的数据
     * @param {Array} fileList 附件列表
     * @param {Object} options 选项
     * @param {Boolean} options.isSave 是否保存
     * @param {String} options.btnName 按钮名称
     */
    async bizSaveFunction(data, fileList, { isSave, btnName } = {}) {
      const {
        templateRef: { backToBackBtnShow, commonCapabilities: { piid } },
        subform,
        subform: { formData }
      } = this.$refs;
      if (backToBackBtnShow) {
        const backToBackList = await new TransService(bizServiceURL).getOrgFile(piid);
        subform.bizSet({ isSetBack: !isEmpty(backToBackList) });
      } else if (isNil(formData.isSetBack)) {
        subform.bizSet({ isSetBack: false });
      }
      return subform.bizSave?.(data, fileList);
    },
    /**
     * 业务端自定义传入选完路径后，点击确定按钮执行下一步操作前，调用的事件
     * @param {Object} params 提交参数
     */
    async bizBeforePathNext(params) {
      // 非开展情况流程或下一节点非特定结束环节时 走默认
      if (this.processDefinitionKey !== 'researchWorkPlan' || params.nextNodeKey !== 'toEnd') {
        return this.$refs.subform.beforePathNext?.(params);
      }
      // 否则在确定路径后弹出周计划填写窗口 根据填写情况提交或取消
      try {
        // 等待用户操作
        await this.openWeekPlan();
      } catch (error) {
        throw new Error();
      }
    },
    /**
     * 业务组件任务提交前事件
     * @param {Object} submitParam 提交参数
     */
    bizBeforeTaskSubmit(submitParam) {
      return this.$refs.subform.beforeTaskSubmit?.(submitParam);
    },
    /**
     * 点击提交确认弹窗中的确认按钮后，任务提交前事件
     * @param submitParam 提交参数
     */
    bizConfirmSubmitEvent(submitParam) {
      return this.$refs.subform.confirmSubmitEvent?.(submitParam);
    },
    /**
     * 点击提交确认弹窗中的取消按钮后的事件
     * @param submitParam 提交参数
     */
    bizCancelSubmitEvent(submitParam) {
      return this.$refs.subform.cancelSubmitEvent?.(submitParam);
    },
    /**
     * 关闭后回调
     */
    bizAfterClose() {},
    /**
     * 业务组件点击顶部提交按钮前调用的事件
     */
    bizBeforeClickSubmitBtn() {
      return this.$refs.subform.beforeClickSubmitBtn?.();
    },
    /**
     * 构造提交参数
     * @param {*} param
     */
    bizBeforeSubmitParam(param) {
      return this.$refs.subform.beforeSubmitParam?.(param);
    },
    /**
     * 业务组件提交后置方法
     * @param {Object} submitParam 提交参数
     * @param {Array} submitRes 提交后生成的任务
     */
    async bizAfterTaskSubmit(submitParam, submitRes) {
      // 子组件提交后方法
      await this.$refs.subform.afterTaskSubmit?.(submitParam, submitRes);
      message('提交成功');
      // 获取统一待办标识
      const { isUnified } = this.$route.query;
      /*
       * 关闭表单，并回刷待办列表
       * 根据不同环境执行不同回刷方式：
       * 1 从统一待办进入表单
       * 1.1 从集约化统一待办进入表单，调用url传入的回刷地址
       * 1.2 从福建统一待办进入表单，调用福建统一待办固定回刷地址
       * 2 从其他环境进入表单，使用opener回刷
       */
      setTimeout(() => {
        // 1 判断是否从统一待办进入表单
        if (ifTrue(isUnified)) {
          const {
            VUE_APP_SUBMIT_SUCCESS_REFRESH_URL,
            VUE_APP_SUBMIT_SUCCESS_APP_ID,
            VUE_APP_SUBMIT_SUCCESS_ITEM_TYPE,
          } = process.env;
          const {
            flushPortalUrl,
            uniqueId,
            taskId,
          } = this;
          // 判断是否从集约化统一待办进入表单
          if (flushPortalUrl) {
            // 1.1 从集约化统一待办进入表单，调用url传入的回刷地址
            window.location.href = new Uri(decodeURIComponent(flushPortalUrl)).query({
              itemId: `${taskId}@${VUE_APP_SUBMIT_SUCCESS_APP_ID}@${sessionStorage.getItem('userId')}`,
              appId: `FJ-${VUE_APP_SUBMIT_SUCCESS_APP_ID}`,
              uniqueId,
            });
            return;
          }
          // 1.2 从福建统一待办进入表单，调用福建统一待办固定回刷地址
          window.open(new Uri(VUE_APP_SUBMIT_SUCCESS_REFRESH_URL).query({
            itemId: taskId,
            appId: VUE_APP_SUBMIT_SUCCESS_APP_ID,
            itemType: VUE_APP_SUBMIT_SUCCESS_ITEM_TYPE,
          }), '_self');
          return;
        }
        // 2 从其他环境进入表单，使用opener回刷
        closeWindow(true);
      }, 1000);
    },
    /**
     * 业务点击注销按钮前调用的事件
     */
    bizBeforeClickCancel() {
      return this.$refs.subform.beforeClickCancel?.();
    },
    /**
     * 业务组件注销前方法
     */
    bizBeforeCancel() {
      return this.$refs.subform.beforeCancel?.();
    },
    /**
     * 业务组件注销后方法
     */
    bizAfterCancel() {
      return this.$refs.subform.afterCancel?.();
    },
    /**
     * 点击顶部按钮事件
     * @param {Object} button 点击的按钮
     */
    doAction(button, fileList) {
      this[button.event]?.(button, fileList);
    },
    /**
     * 编号后事件，需将编号显示到表单上
     * @param {Object} tempNumber 编号对象
     */
    saveNumber(tempNumber) {
      this.$refs.subform.setDocNumber(tempNumber);
    },
  }
};
